﻿Imports FairShop
Imports FairShop.Objects
Imports FairShop.Operaties
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System
Imports System.Collections.Generic
Imports System.Data.OleDb
Imports System.Text
Imports System.IO

<TestClass()> _
Public Class TestDal

    Private testContextInstance As TestContext

    '''<summary>
    '''Gets or sets the test context which provides
    '''information about and functionality for the current test run.
    '''</summary>
    Public Property TestContext() As TestContext
        Get
            Return testContextInstance
        End Get
        Set(ByVal value As TestContext)
            testContextInstance = value
        End Set
    End Property

#Region "Additional test attributes"
    '
    ' You can use the following additional attributes as you write your tests:
    '
    ' Use ClassInitialize to run code before running the first test in the class
    <ClassInitialize()> _
    Public Shared Sub MyClassInitialize(ByVal testContext As TestContext)
        AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory)
    End Sub
    '
    ' Use ClassCleanup to run code after all tests in a class have run
    ' <ClassCleanup()> Public Shared Sub MyClassCleanup()
    ' End Sub
    '
    ' Use TestInitialize to run code before running each test
    '<TestInitialize()> _
    'Public Sub MyTestInitialize()
    'End Sub
    '
    ' Use TestCleanup to run code after each test has run
    '<TestCleanup()> _
    'Public Sub MyTestCleanup()
    'End Sub
    '
#End Region

#Region "Artikels"

    <TestMethod()> _
    Public Sub PrepareArtikelsDatasetTest()
        Dim ds As ArtikelsDataSet = Dal.PrepareArtikelsDataset()
        Assert.IsTrue(ds.Leveranciers.Count > 0)
        Assert.IsTrue(ds.Categorieen.Count > 0)
        Assert.IsTrue(ds.Klanten.Count > 0)
        Assert.IsTrue(ds.Winkeliers.Count > 0)
        Assert.IsTrue(ds.Verkoopsoorten.Count > 0)
        Assert.IsTrue(ds.Artikels.Count > 0)
        Assert.IsTrue(ds.Voorraadbewegingen.Count > 0)
        Assert.IsTrue(ds.Verkopen.Count > 0)
        Assert.IsTrue(ds.VerkoopsDetails.Count > 0)
        Assert.IsTrue(ds.Leveringen.Count > 0)
        Assert.IsTrue(ds.LeveringDetails.Count > 0)
    End Sub

#End Region

#Region "Voorraadbewegingen"

    <TestMethod()> _
    Public Sub TestVoorraadbewegingBewaren()
        Dim dsVoor As New ArtikelsDataSet
        Dim leveranciersAdapter As New ArtikelsDataSetTableAdapters.LeveranciersTableAdapter
        leveranciersAdapter.Fill(dsVoor.Leveranciers)
        Dim klantenAdapter As New ArtikelsDataSetTableAdapters.KlantenTableAdapter
        klantenAdapter.FillById(dsVoor.Klanten, Constants.DEFAULT_KLANT_ID)
        Dim artikelsAdapter As New ArtikelsDataSetTableAdapters.ArtikelsTableAdapter
        artikelsAdapter.FillByBarcode(dsVoor.Artikels, TestData.TEST_BARCODE)
        Dim voorraadbewegingenAdapter As New ArtikelsDataSetTableAdapters.VoorraadbewegingenTableAdapter
        voorraadbewegingenAdapter.Fill(dsVoor.Voorraadbewegingen)

        Dim artikelRow As ArtikelsDataSet.ArtikelsRow = dsVoor.Artikels(0)
        Dim beginVoorraad As Integer = artikelRow.VerwachteVoorraad
        Dim beginAantalBewegingen As Integer = dsVoor.Voorraadbewegingen.Rows.Count

        Dim bewegingRow As ArtikelsDataSet.VoorraadbewegingenRow = dsVoor.Voorraadbewegingen.NewVoorraadbewegingenRow()
        bewegingRow.ArtikelsRow = artikelRow
        bewegingRow.Datum = DateTime.Today()
        bewegingRow.Aantal = TestData.TEST_AANTAL
        bewegingRow.Reden = "Kapot"
        bewegingRow.Inkoopprijs = artikelRow.Inkoopprijs
        dsVoor.Voorraadbewegingen.AddVoorraadbewegingenRow(bewegingRow)

        Dal.VoorraadBewegingToevoegen(bewegingRow)

        Assert.AreEqual(beginVoorraad - TestData.TEST_AANTAL, artikelRow.VerwachteVoorraad)
        Assert.IsFalse(dsVoor.HasChanges)

        Dim dsNa As New ArtikelsDataSet
        leveranciersAdapter.Fill(dsNa.Leveranciers)
        artikelsAdapter.FillByBarcode(dsNa.Artikels, TestData.TEST_BARCODE)
        voorraadbewegingenAdapter.Fill(dsNa.Voorraadbewegingen)

        Dim eindVoorraad As Integer = dsNa.Artikels(0).VerwachteVoorraad
        Assert.AreEqual(beginVoorraad - TestData.TEST_AANTAL, eindVoorraad)
        Assert.AreEqual(beginAantalBewegingen + 1, dsNa.Voorraadbewegingen.Rows.Count)
    End Sub

#End Region

#Region "Verkopen"

    <TestMethod()> _
    Public Sub TestVerkoopBewaren()
        Dim dsVoor As New ArtikelsDataSet
        Dim leveranciersAdapter As New ArtikelsDataSetTableAdapters.LeveranciersTableAdapter
        leveranciersAdapter.Fill(dsVoor.Leveranciers)
        Dim klantenAdapter As New ArtikelsDataSetTableAdapters.KlantenTableAdapter
        klantenAdapter.FillById(dsVoor.Klanten, Constants.DEFAULT_KLANT_ID)
        Dim artikelsAdapter As New ArtikelsDataSetTableAdapters.ArtikelsTableAdapter
        artikelsAdapter.FillByBarcode(dsVoor.Artikels, TestData.TEST_BARCODE)
        Dim winkeliersAdapter As New ArtikelsDataSetTableAdapters.WinkeliersTableAdapter
        winkeliersAdapter.FillById(dsVoor.Winkeliers, Constants.DEFAULT_WINKELIER_ID)
        Dim verkoopsoortenAdapter As New ArtikelsDataSetTableAdapters.VerkoopsoortenTableAdapter
        verkoopsoortenAdapter.Fill(dsVoor.Verkoopsoorten)

        Dim artikelRow As ArtikelsDataSet.ArtikelsRow = dsVoor.Artikels(0)
        Dim beginVoorraad As Integer = artikelRow.VerwachteVoorraad

        Dim verkoopRow As ArtikelsDataSet.VerkopenRow = CreateTestVerkoop(dsVoor)
        'Dim totaal As Decimal = (artikelRow.Prijs + artikelRow.StatiegeldEuro) * TestData.TEST_AANTAL
        'Dim verkoopsDetailsRow As ArtikelsDataSet.VerkoopsDetailsRow = dsVoor.VerkoopsDetails.AddVerkoopsDetailsRow(verkoopRow, _
        '    artikelRow, artikelRow.Prijs, TestData.TEST_AANTAL, artikelRow.Omschrijving, artikelRow.Barcode, _
        '    artikelRow.StatiegeldEuro, artikelRow.BTW, totaal, StatusImage.Huidig) ' simuleer nieuwe verkoop

        Dim verkoopsDetails As New VerkoopsDetail(verkoopRow, artikelRow, artikelRow.Prijs, "", TestData.TEST_AANTAL, 1)
        dsVoor.VerkoopsDetails.AddVerkoopsDetailsRow(verkoopsDetails.DataRow) ' simuleer nieuwe verkoop

        Dal.VerkoopsDetailsBewaren(verkoopRow.GetVerkoopsDetailsRows())

        Dim dsNa As New ArtikelsDataSet ' om data van na het bewaren van de verkoop te bekijken
        leveranciersAdapter.Fill(dsNa.Leveranciers)

        artikelsAdapter.FillByBarcode(dsNa.Artikels, TestData.TEST_BARCODE)
        Dim eindVoorraad As Integer = dsNa.Artikels(0).VerwachteVoorraad

        ' is de voorraad juist?
        Assert.AreEqual(beginVoorraad - TestData.TEST_AANTAL, eindVoorraad)

        Dim verkoopDetailsAdapter As New ArtikelsDataSetTableAdapters.VerkoopsDetailsTableAdapter()
        verkoopDetailsAdapter.FillByIdVerkoop(dsNa.VerkoopsDetails, verkoopRow.Id)
        Assert.AreEqual(TestData.TEST_AANTAL, dsNa.VerkoopsDetails(0).Aantal)

        ' TODO: opruimen
    End Sub

    '''<summary>
    '''A test for LaatsteVerkoopEindTotaalOphalen
    '''</summary>
    <TestMethod()> _
    Public Sub LaatsteVerkoopEindTotaalOphalenTest()
        Dim ds As ArtikelsDataSet = Utility.Data
        Dim verkoopRow As ArtikelsDataSet.VerkopenRow = ds.Verkopen.NewVerkopenRow()
        verkoopRow.KlantenRow = ds.Klanten(0)
        verkoopRow.CashBetaald = True
        verkoopRow.WinkeliersRow = ds.Winkeliers(0)
        verkoopRow.VerkoopsoortenRow = ds.Verkoopsoorten(0)
        verkoopRow.Datum = DateTime.Today()
        verkoopRow.Tijd = "Niet van toepassing"
        verkoopRow.Begintotaal = 0D
        verkoopRow.Eindtotaal = TestData.TEST_BEDRAG
        verkoopRow.CommentaarBegintotaal = ""
        verkoopRow.CommentaarEindtotaal = ""
        verkoopRow.InUitKasBedrag = 0D
        verkoopRow.InUitKasReden = ""
        verkoopRow.NaarBankBedrag = 0D
        verkoopRow.NaarBankNaam = ""
        verkoopRow.NaarBankReferentie = 0
        verkoopRow.FactuurNummer = 0
        verkoopRow.IsFactuurBehandeld = False
        verkoopRow.Omschrijving = ""
        verkoopRow.BedragBancontact = 0D
        verkoopRow.BedragMaaltijdcheques = 0D

        ds.Verkopen.AddVerkopenRow(verkoopRow)

        Dal.VerkoopToevoegen(verkoopRow)

        Dim expected As Decimal = TestData.TEST_BEDRAG
        Dim actual As Decimal = ArtikelsBL.LaatsteVerkoopEindTotaalOphalen()
        Assert.AreEqual(expected, actual)
    End Sub

#End Region

#Region "Verkoopsdetails"

    <TestMethod()> _
    Public Sub VerkoopsDetailsBewarenBijNieuweLeveringsbonTest()
        ' Arrange
        Dim ds As ArtikelsDataSet = Dal.PrepareArtikelsDataset()
        Dim verkopenAdapter As New ArtikelsDataSetTableAdapters.VerkopenTableAdapter
        verkopenAdapter.Fill(ds.Verkopen)
        Dim verkoopRow As ArtikelsDataSet.VerkopenRow = CreateTestVerkoop(ds)
        Dim artikelsRow As ArtikelsDataSet.ArtikelsRow = ds.Artikels.FindById(TestData.DEFAULT_ARTIKEL_ID)
        Dim aantalVerkopen As Integer = ds.Verkopen.Count

        ' Act
        ds.VerkoopsDetails.AddVerkoopsDetailsRow(verkoopRow, 1, artikelsRow, 1.0, 1, "Unittest", "Barcode", 6.0, 1.0, 0.0, 0.0, 0, "", False)
        Dim idLeveringsbonVerkoop As Integer = _
           ArtikelsBL.VerkoopsDetailsBewarenBijNieuweLeveringsbon(verkoopRow, Constants.DEFAULT_KLANT_ID, "Testverkoop", _
                Constants.DEFAULT_WINKELIER_ID, False)

        ' Assert
        verkopenAdapter.Fill(ds.Verkopen)
        Assert.AreEqual(aantalVerkopen + 1, ds.Verkopen.Count)

        Dim verkoopsDetailsAdapter As New ArtikelsDataSetTableAdapters.VerkoopsDetailsTableAdapter
        verkoopsDetailsAdapter.FillByIdVerkoop(ds.VerkoopsDetails, idLeveringsbonVerkoop)

        Assert.AreEqual(1, ds.VerkoopsDetails.Count)
        Assert.AreEqual(TestData.DEFAULT_ARTIKEL_ID, ds.VerkoopsDetails(0).ArtikelsRow.Id)
        Assert.AreEqual(Constants.VerkoopsoortIds.FACTUUR, ds.VerkoopsDetails(0).VerkopenRow.VerkoopsoortenRow.Id)

        ' TODO: eventueel opruimen
    End Sub

    <TestMethod()> _
    Public Sub VerkoopsDetailsVanLeveringsbonAnnulerenTest()
        ' Arrange
        Dim leveringsbonRow As ArtikelsDataSet.VerkopenRow = CreateTestVerkoop(Utility.Data)
        Dim artikelsRow As ArtikelsDataSet.ArtikelsRow = Utility.Data.Artikels.FindById(TestData.DEFAULT_ARTIKEL_ID)
        Utility.Data.VerkoopsDetails.AddVerkoopsDetailsRow(leveringsbonRow, 1, artikelsRow, 5D, 1, "Unittest", "Barcode", 6.0, 1.0, 0.0, 0.0, 0, "", False)
        Dal.VerkoopsDetailsBewaren(leveringsbonRow.GetVerkoopsDetailsRows())
        Dim aantalVerkopen As Integer = Utility.Data.Verkopen.Count
        Dim totaal As Decimal = 0D
        For Each rij As ArtikelsDataSet.VerkoopsDetailsRow In leveringsbonRow.GetVerkoopsDetailsRows
            totaal += (rij.Totaal + rij.TotaalStatiegeld)
        Next
        Assert.AreNotEqual(0D, totaal)

        ' Act
        Dim kasbladDs As ArtikelsDataSet = Dal.VerkoopsDetailsVanLeveringsbonAnnuleren(leveringsbonRow.Id)
        ' opnieuw ophalen
        Dim verkoopsdetailsAdapter As New ArtikelsDataSetTableAdapters.VerkoopsDetailsTableAdapter
        verkoopsdetailsAdapter.Fill(Utility.Data.VerkoopsDetails)

        ' Assert
        Assert.AreEqual(aantalVerkopen, Utility.Data.Verkopen.Count)
        Assert.AreEqual(1, kasbladDs.VerkoopsDetails.Count)
        Assert.AreEqual(1, kasbladDs.VerkoopsDetails(0).Aantal)
        Assert.AreEqual(5D, kasbladDs.VerkoopsDetails(0).Prijs)
        totaal = 0D
        For Each rij As ArtikelsDataSet.VerkoopsDetailsRow In leveringsbonRow.GetVerkoopsDetailsRows
            totaal += (rij.Totaal + rij.TotaalStatiegeld)
        Next
        Assert.AreEqual(0D, totaal, "Totaal van de geannuleerde leveringsbon is niet nul") ' leveringsbon moet op 0 gekomen zijn
        Assert.IsTrue(Utility.IsVerkoopGeannuleerd(leveringsbonRow), "Leveringsbon is niet goed geannuleerd")
    End Sub

#End Region

#Region "Onbekende barcodes"

    <TestMethod()> _
    Public Sub OnbekendeBarcodeToevoegenTest()
        Dim actual As Boolean = Dal.OnbekendeBarcodeToevoegen("0000111122223333")
        Dim expected As Boolean = True
        Assert.AreEqual(expected, actual)
    End Sub

#End Region

#Region "Emailadressen"

    <TestMethod()> _
    Public Sub NieuwEmailAdresToevoegenTest()
        ' ARRANGE
        Dim testAdres As String = "test@test.be"
        Dim aantalVoor As Integer = GetAantalEmailadressen()

        ' ACT
        Dim returnvalue As Integer = Dal.EmailadresToevoegen(testAdres)

        ' ASSERT
        Assert.AreEqual(1, returnvalue)
        Dim aantalNa As Integer = GetAantalEmailadressen()
        Assert.AreEqual(aantalVoor + 1, aantalNa)

        ' opruimen
        CleanUpEmailadres(testAdres)
    End Sub

    <TestMethod()> _
    Public Sub BestaandEmailAdresToevoegenTest()
        ' ARRANGE
        Dim testAdres As String = "test@test.be"
        Dal.EmailadresToevoegen(testAdres)
        Dim aantalVoor As Integer = GetAantalEmailadressen()

        ' ACT
        ' nog eens hetzelfde adres toevoegen
        Dim returnvalue As Integer = Dal.EmailadresToevoegen(testAdres)

        ' ASSERT
        Assert.AreEqual(0, returnvalue)
        Dim aantalNa As Integer = GetAantalEmailadressen()
        Assert.AreEqual(aantalVoor, aantalNa)

        ' opruimen
        CleanUpEmailadres(testAdres)
    End Sub

#End Region

#Region "Helperfuncties"

    Private Shared Function CreateTestVerkoop(ByVal ds As ArtikelsDataSet) As ArtikelsDataSet.VerkopenRow
        Dim verkoopRow As ArtikelsDataSet.VerkopenRow = ds.Verkopen.NewVerkopenRow()
        verkoopRow.KlantenRow = ds.Klanten(0)
        verkoopRow.CashBetaald = True
        verkoopRow.WinkeliersRow = ds.Winkeliers(0)
        verkoopRow.VerkoopsoortenRow = ds.Verkoopsoorten(0)
        verkoopRow.Datum = DateTime.Today()
        verkoopRow.Tijd = "Niet van toepassing"
        verkoopRow.Begintotaal = 0D
        verkoopRow.Eindtotaal = 0D
        verkoopRow.CommentaarBegintotaal = ""
        verkoopRow.CommentaarEindtotaal = ""
        verkoopRow.InUitKasBedrag = 0D
        verkoopRow.InUitKasReden = ""
        verkoopRow.NaarBankBedrag = 0D
        verkoopRow.NaarBankNaam = ""
        verkoopRow.NaarBankReferentie = 0
        verkoopRow.FactuurNummer = 0
        verkoopRow.IsFactuurBehandeld = False
        verkoopRow.Omschrijving = ""
        verkoopRow.BedragBancontact = 0D
        verkoopRow.BedragMaaltijdcheques = 0D
        ds.Verkopen.AddVerkopenRow(verkoopRow)
        Dal.VerkoopToevoegen(verkoopRow)
        Return verkoopRow
    End Function

    Private Function GetConnectionString() As String
        Dim diTestDeployFolder As New DirectoryInfo(TestContext.TestDir)
        Dim diSolutionRoot As DirectoryInfo = diTestDeployFolder.Parent.Parent
        Dim dbLocation As String = diSolutionRoot.FullName & "\FairShop\bin\x86\Debug\App_Data\FairShopOefen.mdb"
        Return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbLocation
    End Function

    Private Function GetAantalEmailadressen() As Integer
        Dim conn As New OleDbConnection(GetConnectionString)
        Try
            conn.Open()
            Dim strSQL1 As String = "SELECT COUNT(*) FROM Emailadressen"
            Dim cm1 As New OleDbCommand(strSQL1, conn)
            Return Convert.ToInt32(cm1.ExecuteScalar())
        Finally
            conn.Close()
        End Try
    End Function

    Public Sub CleanUpEmailadres(ByVal testAdres As String)
        Dim conn As New OleDbConnection(GetConnectionString)
        Try
            conn.Open()
            Dim strSQL1 As String = "DELETE FROM Emailadressen WHERE Email = ?"
            Dim cm1 As New OleDbCommand(strSQL1, conn)
            cm1.Parameters.AddWithValue("Email", testAdres)
            cm1.ExecuteNonQuery()
        Finally
            conn.Close()
        End Try
    End Sub

#End Region

End Class
